<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 5.4.0">
  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png">
  <link rel="mask-icon" href="/images/logo.svg" color="#222">

<link rel="stylesheet" href="/css/main.css">


<link rel="stylesheet" href="/lib/font-awesome/css/all.min.css">

<script id="hexo-configurations">
    var NexT = window.NexT || {};
    var CONFIG = {"hostname":"example.com","root":"/","scheme":"Gemini","version":"7.8.0","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12,"onmobile":false},"copycode":{"enable":false,"show_result":false,"style":null},"back2top":{"enable":true,"sidebar":false,"scrollpercent":false},"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":false,"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"algolia":{"hits":{"per_page":10},"labels":{"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}},"localsearch":{"enable":false,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}}};
  </script>

  <meta name="description" content="𝐒𝐭𝐫𝐞𝐞𝐭 𝐅𝐢𝐠𝐡𝐭𝐞𝐫 𝐯𝐬. 𝐃𝐐𝐍 𝐅𝐢𝐠𝐡𝐭𝐞𝐫𝖈𝖞𝖇𝖊𝖗𝖈𝖔𝖑𝖞𝖈𝖊   𝖎𝖓𝖙𝖗𝖔𝖉𝖚𝖈𝖙𝖎𝖔𝖓I would like to apply an improve DQN to the Game Street Fighter V,an action game publish by CAPC">
<meta property="og:type" content="article">
<meta property="og:title" content="𝐒𝐭𝐫𝐞𝐞𝐭 𝐅𝐢𝐠𝐡𝐭𝐞𝐫 𝐯𝐬. 𝐃𝐐𝐍 𝐅𝐢𝐠𝐡𝐭𝐞𝐫">
<meta property="og:url" content="http://example.com/2021/12/15/DQN%E8%87%AA%E6%88%91%E5%AE%9E%E8%B7%B5/index.html">
<meta property="og:site_name" content="-北真海-">
<meta property="og:description" content="𝐒𝐭𝐫𝐞𝐞𝐭 𝐅𝐢𝐠𝐡𝐭𝐞𝐫 𝐯𝐬. 𝐃𝐐𝐍 𝐅𝐢𝐠𝐡𝐭𝐞𝐫𝖈𝖞𝖇𝖊𝖗𝖈𝖔𝖑𝖞𝖈𝖊   𝖎𝖓𝖙𝖗𝖔𝖉𝖚𝖈𝖙𝖎𝖔𝖓I would like to apply an improve DQN to the Game Street Fighter V,an action game publish by CAPC">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="h:/Street%20Fighter%20V%20Arcade%20Edition/StreetFighterV/Content/Splash/Splash.bmp">
<meta property="og:image" content="https://i.loli.net/2021/09/08/84P5qBKMUWn6JLb.png">
<meta property="og:image" content="https://i.loli.net/2021/09/08/sGI6nJjkTADOZbd.png">
<meta property="og:image" content="https://i.loli.net/2021/09/08/13NdY7S6WtCLczw.png">
<meta property="article:published_time" content="2021-12-15T11:10:21.180Z">
<meta property="article:modified_time" content="2022-01-01T16:18:42.268Z">
<meta property="article:author" content="花">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="h:/Street%20Fighter%20V%20Arcade%20Edition/StreetFighterV/Content/Splash/Splash.bmp">

<link rel="canonical" href="http://example.com/2021/12/15/DQN%E8%87%AA%E6%88%91%E5%AE%9E%E8%B7%B5/">


<script id="page-configurations">
  // https://hexo.io/docs/variables.html
  CONFIG.page = {
    sidebar: "",
    isHome : false,
    isPost : true,
    lang   : 'zh-CN'
  };
</script>

  <title>𝐒𝐭𝐫𝐞𝐞𝐭 𝐅𝐢𝐠𝐡𝐭𝐞𝐫 𝐯𝐬. 𝐃𝐐𝐍 𝐅𝐢𝐠𝐡𝐭𝐞𝐫 | -北真海-</title>
  






  <noscript>
  <style>
  .use-motion .brand,
  .use-motion .menu-item,
  .sidebar-inner,
  .use-motion .post-block,
  .use-motion .pagination,
  .use-motion .comments,
  .use-motion .post-header,
  .use-motion .post-body,
  .use-motion .collection-header { opacity: initial; }

  .use-motion .site-title,
  .use-motion .site-subtitle {
    opacity: initial;
    top: initial;
  }

  .use-motion .logo-line-before i { left: initial; }
  .use-motion .logo-line-after i { right: initial; }
  </style>
</noscript>

</head>

<body itemscope itemtype="http://schema.org/WebPage">
  <div class="container use-motion">
    <div class="headband"></div>

    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="切换导航栏">
      <span class="toggle-line toggle-line-first"></span>
      <span class="toggle-line toggle-line-middle"></span>
      <span class="toggle-line toggle-line-last"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/" class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <h1 class="site-title">-北真海-</h1>
      <span class="logo-line-after"><i></i></span>
    </a>
      <p class="site-subtitle" itemprop="description">cybercolyce</p>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger">
    </div>
  </div>
</div>




<nav class="site-nav">
  <ul id="menu" class="main-menu menu">
        <li class="menu-item menu-item-home">

    <a href="/" rel="section"><i class="fa fa-home fa-fw"></i>首页</a>

  </li>
        <li class="menu-item menu-item-archives">

    <a href="/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>归档</a>

  </li>
  </ul>
</nav>




</div>
    </header>

    
  <div class="back-to-top">
    <i class="fa fa-arrow-up"></i>
    <span>0%</span>
  </div>


    <main class="main">
      <div class="main-inner">
        <div class="content-wrap">
          

          <div class="content post posts-expand">
            

    
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-CN">
    <link itemprop="mainEntityOfPage" href="http://example.com/2021/12/15/DQN%E8%87%AA%E6%88%91%E5%AE%9E%E8%B7%B5/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="花">
      <meta itemprop="description" content="我最喜欢cybersh1t了">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="-北真海-">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          𝐒𝐭𝐫𝐞𝐞𝐭 𝐅𝐢𝐠𝐡𝐭𝐞𝐫 𝐯𝐬. 𝐃𝐐𝐍 𝐅𝐢𝐠𝐡𝐭𝐞𝐫
        </h1>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="far fa-calendar"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>

              <time title="创建时间：2021-12-15 19:10:21" itemprop="dateCreated datePublished" datetime="2021-12-15T19:10:21+08:00">2021-12-15</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="far fa-calendar-check"></i>
                </span>
                <span class="post-meta-item-text">更新于</span>
                <time title="修改时间：2022-01-02 00:18:42" itemprop="dateModified" datetime="2022-01-02T00:18:42+08:00">2022-01-02</time>
              </span>

          

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
        <h1 id="𝐒𝐭𝐫𝐞𝐞𝐭-𝐅𝐢𝐠𝐡𝐭𝐞𝐫-𝐯𝐬-𝐃𝐐𝐍-𝐅𝐢𝐠𝐡𝐭𝐞𝐫"><a href="#𝐒𝐭𝐫𝐞𝐞𝐭-𝐅𝐢𝐠𝐡𝐭𝐞𝐫-𝐯𝐬-𝐃𝐐𝐍-𝐅𝐢𝐠𝐡𝐭𝐞𝐫" class="headerlink" title="𝐒𝐭𝐫𝐞𝐞𝐭 𝐅𝐢𝐠𝐡𝐭𝐞𝐫 𝐯𝐬. 𝐃𝐐𝐍 𝐅𝐢𝐠𝐡𝐭𝐞𝐫"></a>𝐒𝐭𝐫𝐞𝐞𝐭 𝐅𝐢𝐠𝐡𝐭𝐞𝐫 𝐯𝐬. 𝐃𝐐𝐍 𝐅𝐢𝐠𝐡𝐭𝐞𝐫</h1><center>𝖈𝖞𝖇𝖊𝖗𝖈𝖔𝖑𝖞𝖈𝖊</center>

<p><img src="H:\Street%20Fighter%20V%20Arcade%20Edition\StreetFighterV\Content\Splash\Splash.bmp"></p>
<h2 id="𝖎𝖓𝖙𝖗𝖔𝖉𝖚𝖈𝖙𝖎𝖔𝖓"><a href="#𝖎𝖓𝖙𝖗𝖔𝖉𝖚𝖈𝖙𝖎𝖔𝖓" class="headerlink" title="𝖎𝖓𝖙𝖗𝖔𝖉𝖚𝖈𝖙𝖎𝖔𝖓"></a>𝖎𝖓𝖙𝖗𝖔𝖉𝖚𝖈𝖙𝖎𝖔𝖓</h2><p>I would like to apply an improve DQN to the Game Street Fighter V,an action game publish by CAPCOM in 2016. This project was inspired by LinYi and I try to use DQN without HPE(Human Pose Estimation) due to the limitation of my hardware.</p>
<p>I try to train a model with less time training and more robust to any other Acion fighting game. This may be cool and difficult since I need to prepare my exam while handling other projects in this very year. </p>
<span id="more"></span>

<h2 id="𝕻𝖗𝖊𝖕𝖆𝖗𝖎𝖓𝖌"><a href="#𝕻𝖗𝖊𝖕𝖆𝖗𝖎𝖓𝖌" class="headerlink" title="𝕻𝖗𝖊𝖕𝖆𝖗𝖎𝖓𝖌"></a>𝕻𝖗𝖊𝖕𝖆𝖗𝖎𝖓𝖌</h2><h3 id="Before-we-start"><a href="#Before-we-start" class="headerlink" title="Before we start"></a>Before we start</h3><p>We need access to some in-game factors that help game agent better comprehend the situation(Though these factors are simply shown in the screen,I would like to use in-game memory to get which is faster and relieve GPU’s burden if use CV method to convert these images’ info).</p>
<img src="https://i.loli.net/2021/09/08/84P5qBKMUWn6JLb.png" alt="image-20210908230408019" style="zoom: 67%;" />

<p>However,CAPCOM use anti-spam to block the access to read memory while the game runs,which may crash the game if you turn some basic memory search tools like <code>CheatEngine</code>.I use this <a target="_blank" rel="noopener" href="https://bbs.pediy.com/thread-195729.htm">Tool</a> to avoid detection and it actually works!(By the way ,the unzip code is <code>qq295991</code>).</p>
<p>In addition,you should open the software before you launch the game,and change the default settings to this:</p>
<img src="https://i.loli.net/2021/09/08/sGI6nJjkTADOZbd.png" alt="image-20210908230121851" style="zoom: 80%;" />



<p>Then you can search the factors you need and locate their base&amp;offset address.</p>
<img src="https://i.loli.net/2021/09/08/13NdY7S6WtCLczw.png" alt="image-20210908230121851" style="zoom: 80%;" />



<p>The Following Problem is that when I use <code>openProcess</code> in <code>win32api</code> to get value of the factors it returns the error like this:</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Traceback (most recent call last):</span><br><span class="line">  File <span class="string">&quot;G:/SFV/Tool/factors.py&quot;</span>, line <span class="number">180</span>, <span class="keyword">in</span> &lt;module&gt;</span><br><span class="line">    hp = Gamefactors()</span><br><span class="line">  File <span class="string">&quot;G:/SFV/Tool/factors.py&quot;</span>, line <span class="number">55</span>, <span class="keyword">in</span> __init__</span><br><span class="line">    hProcess = win32api.OpenProcess(</span><br><span class="line">pywintypes.error: (<span class="number">5</span>, <span class="string">&#x27;OpenProcess&#x27;</span>, <span class="string">&#x27;Access Denied.&#x27;</span>)</span><br></pre></td></tr></table></figure>

<p>It really takes me a long time to find the solution:( I look up the MSDN and find this:</p>
<blockquote>
<p>If the caller has enabled the SeDebugPrivilege privilege, the requested access is granted regardless of the contents of the security descriptor.</p>
</blockquote>
<p>Which means I need the <code>SeDebugPrivilege</code> huh…So I write a function to get more privileges:</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">get_extra_privs</span>():</span>  <span class="comment"># get more access to the game</span></span><br><span class="line">    <span class="comment"># Try to give ourselves some extra privs (only works if we&#x27;re admin):</span></span><br><span class="line">    <span class="comment"># SeBackupPrivilege   - so we can read anything</span></span><br><span class="line">    <span class="comment"># SeDebugPrivilege    - so we can find out about other processes (otherwise OpenProcess will fail for some)</span></span><br><span class="line">    <span class="comment"># SeSecurityPrivilege - ??? what does this do?</span></span><br><span class="line"></span><br><span class="line">    th = win32security.OpenProcessToken(win32api.GetCurrentProcess(),</span><br><span class="line">                                        win32con.TOKEN_ADJUST_PRIVILEGES | win32con.TOKEN_QUERY)</span><br><span class="line">    privs = win32security.GetTokenInformation(th, win32security.TokenPrivileges)</span><br><span class="line">    newprivs = []</span><br><span class="line">    <span class="keyword">for</span> privtuple <span class="keyword">in</span> privs:</span><br><span class="line">        <span class="keyword">if</span> privtuple[<span class="number">0</span>] == win32security.LookupPrivilegeValue(<span class="literal">None</span>, <span class="string">&quot;SeBackupPrivilege&quot;</span>) <span class="keyword">or</span> privtuple[</span><br><span class="line">            <span class="number">0</span>] == win32security.LookupPrivilegeValue(<span class="literal">None</span>, <span class="string">&quot;SeDebugPrivilege&quot;</span>) <span class="keyword">or</span> privtuple[</span><br><span class="line">            <span class="number">0</span>] == win32security.LookupPrivilegeValue(<span class="literal">None</span>, <span class="string">&quot;SeSecurityPrivilege&quot;</span>):</span><br><span class="line">            <span class="comment"># print(&quot;Added privilege &quot; + str(privtuple[0]))</span></span><br><span class="line">            newprivs.append((privtuple[<span class="number">0</span>], <span class="number">2</span>))  <span class="comment"># SE_PRIVILEGE_ENABLED</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            newprivs.append((privtuple[<span class="number">0</span>], privtuple[<span class="number">1</span>]))</span><br><span class="line"></span><br><span class="line">    <span class="comment"># Adjust privs</span></span><br><span class="line">    privs = <span class="built_in">tuple</span>(newprivs)</span><br><span class="line">    win32security.AdjustTokenPrivileges(th, <span class="literal">False</span>, privs)</span><br></pre></td></tr></table></figure>

<p> Now we need to access these factors: </p>
<ul>
<li>Player&amp;Rival’s HP</li>
<li>Player&amp;Rival’s EX</li>
<li>Player&amp;Rival’s VT</li>
<li>Player&amp;Rival’s location</li>
</ul>
<p>Yet we need to notice that player’s &amp; rival’s location are not in float type while HPs are in normal byte type, so we need a function to transfer Byte type to Float type:</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">byte2Float</span>(<span class="params">s</span>):</span>  <span class="comment"># Convert byte to float</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        i = <span class="built_in">int</span>(s, <span class="number">10</span>)  <span class="comment"># convert from Dec to a Python int</span></span><br><span class="line">        cp = pointer(c_int(i))  <span class="comment"># make this into a c integer</span></span><br><span class="line">        fp = cast(cp, POINTER(c_float))  <span class="comment"># cast the int pointer to a float pointer</span></span><br><span class="line">        a = fp.contents.value</span><br><span class="line">    <span class="keyword">except</span>:</span><br><span class="line">        a = <span class="number">0</span></span><br><span class="line">    <span class="keyword">finally</span>:</span><br><span class="line">        <span class="keyword">return</span> a</span><br></pre></td></tr></table></figure>

<h3 id="Why-not-define-a-class"><a href="#Why-not-define-a-class" class="headerlink" title="Why not define a class?"></a>Why not define a class?</h3><p>We can add function to this class to reduce the time spent on accessing these factors:</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Hp_getter</span>():</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self</span>):</span></span><br><span class="line">        get_extra_privs()</span><br><span class="line">        hd = win32gui.FindWindow(<span class="literal">None</span>, <span class="string">&quot;StreetFighterV&quot;</span>)</span><br><span class="line">        pid = win32process.GetWindowThreadProcessId(hd)[<span class="number">1</span>]</span><br><span class="line">        self.process_handle = win32api.OpenProcess(<span class="number">0x1F0FFF</span>, <span class="literal">False</span>, pid)</span><br><span class="line">        self.kernal32 = ctypes.windll.LoadLibrary(<span class="string">r&quot;C:\\Windows\\System32\\kernel32.dll&quot;</span>)</span><br><span class="line"></span><br><span class="line">        self.hx = <span class="number">0</span></span><br><span class="line">        <span class="comment"># get dll address</span></span><br><span class="line">        hProcess = Kernel32.OpenProcess(</span><br><span class="line">            PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,</span><br><span class="line">            <span class="literal">False</span>, pid)</span><br><span class="line">        hModule = EnumProcessModulesEx(hProcess)</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> hModule:</span><br><span class="line">            temp = win32process.GetModuleFileNameEx(self.process_handle, i.value)</span><br><span class="line">            <span class="keyword">if</span> temp[-<span class="number">18</span>:] == <span class="string">&quot;StreetFighterV.exe&quot;</span>:</span><br><span class="line">                self.StreetFighter=i.value</span><br><span class="line">                <span class="built_in">print</span>(self.StreetFighter)</span><br></pre></td></tr></table></figure>

<p>And by the way no thanks:</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">EnumProcessModulesEx</span>(<span class="params">hProcess</span>):</span></span><br><span class="line">    buf_count = <span class="number">256</span></span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        LIST_MODULES_ALL = <span class="number">0x03</span></span><br><span class="line">        buf = (ctypes.wintypes.HMODULE * buf_count)()</span><br><span class="line">        buf_size = ctypes.sizeof(buf)</span><br><span class="line">        needed = ctypes.wintypes.DWORD()</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> Psapi.EnumProcessModulesEx(hProcess, ctypes.byref(buf), buf_size, ctypes.byref(needed),</span><br><span class="line">                                          LIST_MODULES_ALL):</span><br><span class="line">            <span class="keyword">raise</span> OSError(<span class="string">&#x27;EnumProcessModulesEx failed&#x27;</span>)</span><br><span class="line">        <span class="keyword">if</span> buf_size &lt; needed.value:</span><br><span class="line">            buf_count = needed.value // (buf_size // buf_count)</span><br><span class="line">            <span class="keyword">continue</span></span><br><span class="line">        count = needed.value // (buf_size // buf_count)</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">map</span>(ctypes.wintypes.HMODULE, buf[:count])</span><br></pre></td></tr></table></figure>



<p>Shit Capcom change HP if u hide UI</p>

    </div>

    
    
    

      <footer class="post-footer">

        


        
    <div class="post-nav">
      <div class="post-nav-item"></div>
      <div class="post-nav-item">
    <a href="/2022/01/01/FPGA/" rel="next" title="VHDL简易入门">
      VHDL简易入门 <i class="fa fa-chevron-right"></i>
    </a></div>
    </div>
      </footer>
    
  </article>
  
  
  



          </div>
          

<script>
  window.addEventListener('tabs:register', () => {
    let { activeClass } = CONFIG.comments;
    if (CONFIG.comments.storage) {
      activeClass = localStorage.getItem('comments_active') || activeClass;
    }
    if (activeClass) {
      let activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`);
      if (activeTab) {
        activeTab.click();
      }
    }
  });
  if (CONFIG.comments.storage) {
    window.addEventListener('tabs:click', event => {
      if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
      let commentClass = event.target.classList[1];
      localStorage.setItem('comments_active', commentClass);
    });
  }
</script>

        </div>
          
  
  <div class="toggle sidebar-toggle">
    <span class="toggle-line toggle-line-first"></span>
    <span class="toggle-line toggle-line-middle"></span>
    <span class="toggle-line toggle-line-last"></span>
  </div>

  <aside class="sidebar">
    <div class="sidebar-inner">

      <ul class="sidebar-nav motion-element">
        <li class="sidebar-nav-toc">
          文章目录
        </li>
        <li class="sidebar-nav-overview">
          站点概览
        </li>
      </ul>

      <!--noindex-->
      <div class="post-toc-wrap sidebar-panel">
          <div class="post-toc motion-element"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#%F0%9D%90%92%F0%9D%90%AD%F0%9D%90%AB%F0%9D%90%9E%F0%9D%90%9E%F0%9D%90%AD-%F0%9D%90%85%F0%9D%90%A2%F0%9D%90%A0%F0%9D%90%A1%F0%9D%90%AD%F0%9D%90%9E%F0%9D%90%AB-%F0%9D%90%AF%F0%9D%90%AC-%F0%9D%90%83%F0%9D%90%90%F0%9D%90%8D-%F0%9D%90%85%F0%9D%90%A2%F0%9D%90%A0%F0%9D%90%A1%F0%9D%90%AD%F0%9D%90%9E%F0%9D%90%AB"><span class="nav-number">1.</span> <span class="nav-text">𝐒𝐭𝐫𝐞𝐞𝐭 𝐅𝐢𝐠𝐡𝐭𝐞𝐫 𝐯𝐬. 𝐃𝐐𝐍 𝐅𝐢𝐠𝐡𝐭𝐞𝐫</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#%F0%9D%96%8E%F0%9D%96%93%F0%9D%96%99%F0%9D%96%97%F0%9D%96%94%F0%9D%96%89%F0%9D%96%9A%F0%9D%96%88%F0%9D%96%99%F0%9D%96%8E%F0%9D%96%94%F0%9D%96%93"><span class="nav-number">1.1.</span> <span class="nav-text">𝖎𝖓𝖙𝖗𝖔𝖉𝖚𝖈𝖙𝖎𝖔𝖓</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%F0%9D%95%BB%F0%9D%96%97%F0%9D%96%8A%F0%9D%96%95%F0%9D%96%86%F0%9D%96%97%F0%9D%96%8E%F0%9D%96%93%F0%9D%96%8C"><span class="nav-number">1.2.</span> <span class="nav-text">𝕻𝖗𝖊𝖕𝖆𝖗𝖎𝖓𝖌</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#Before-we-start"><span class="nav-number">1.2.1.</span> <span class="nav-text">Before we start</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Why-not-define-a-class"><span class="nav-number">1.2.2.</span> <span class="nav-text">Why not define a class?</span></a></li></ol></li></ol></li></ol></div>
      </div>
      <!--/noindex-->

      <div class="site-overview-wrap sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
  <p class="site-author-name" itemprop="name">花</p>
  <div class="site-description" itemprop="description">我最喜欢cybersh1t了</div>
</div>
<div class="site-state-wrap motion-element">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
          <a href="/archives/">
        
          <span class="site-state-item-count">2</span>
          <span class="site-state-item-name">日志</span>
        </a>
      </div>
  </nav>
</div>
  <div class="links-of-author motion-element">
      <span class="links-of-author-item">
        <a href="https://github.com/dafeigy" title="GitHub → https:&#x2F;&#x2F;github.com&#x2F;dafeigy" rel="noopener" target="_blank"><i class="fab fa-github fa-fw"></i>GitHub</a>
      </span>
      <span class="links-of-author-item">
        <a href="mailto:1070642765@qq.com" title="E-Mail → mailto:1070642765@qq.com" rel="noopener" target="_blank"><i class="fa fa-envelope fa-fw"></i>E-Mail</a>
      </span>
      <span class="links-of-author-item">
        <a href="https://weibo.com/cybercolyce" title="Weibo → https:&#x2F;&#x2F;weibo.com&#x2F;cybercolyce" rel="noopener" target="_blank"><i class="fab fa-weibo fa-fw"></i>Weibo</a>
      </span>
  </div>



      </div>

    </div>
  </aside>
  <div id="sidebar-dimmer"></div>


      </div>
    </main>

    <footer class="footer">
      <div class="footer-inner">
        

        

<div class="copyright">
  
  &copy; 
  <span itemprop="copyrightYear">2022</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">花</span>
</div>

        








      </div>
    </footer>
  </div>

  
  <script src="/lib/anime.min.js"></script>
  <script src="/lib/velocity/velocity.min.js"></script>
  <script src="/lib/velocity/velocity.ui.min.js"></script>

<script src="/js/utils.js"></script>

<script src="/js/motion.js"></script>


<script src="/js/schemes/pisces.js"></script>


<script src="/js/next-boot.js"></script>




  















  

  

</body>
</html>
